package com.spring.springbootmodel.service;

import cn.hutool.core.util.RandomUtil;
import com.spring.springbootmodel.entyti.User;
import com.spring.springbootmodel.exception.ServiceException;
import com.spring.springbootmodel.mapper.UserMapper;
import com.spring.springbootmodel.utils.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserService {
    @Autowired
    UserMapper userMapper;

    /**
     * 新增用户信息
     */
    public void insertUser(User user) {
        userMapper.insert(user);
    }

    /**
     * 修改用户信息
     */
    public void updatetUser(User user) {
        userMapper.update(user);
    }

    /**
     * 删除用户信息（单）
     */
    public void deleteUserOneById(Integer id) {
        userMapper.deleteUserOneById(id);
    }

    /**
     * 删除用户信息（多）
     */
    public void deleteUsersOneByIds(List<Integer> ids) {
        for (Integer id : ids) {
            userMapper.deleteUserOneById(id);
        }
    }

    /**
     * 查询全部数据
     */
    public List<User> selectAll() {
        return userMapper.selectAll();
    }

    /**
     * 根据id查询用户信息
     */
    public User selectById(Integer id) {
        return userMapper.selectById(id);
    }

    /**
     * 根据name查询多条用户信息
     */
    public List<User> selectByName(String name) {
        return userMapper.selectByName(name);
    }

    /**
     * 多条件查询
     * 根据name和username查询多条用户信息
     */
    public List<User> selectByNameAndUsername(String name, String username) {
        return userMapper.selectByNameAndUsername(name, username);
    }

    /**
     * 多条件查询(模糊查询)
     * 根据name和username查询多条用户信息
     */
    public List<User> selectByMo(String name, String username) {
        return userMapper.selectByMo(name, username);
    }

    /**
     * 多条件查询(分页模糊查询)
     * 根据name和username查询多条用户信息
     */
    public Map<String, Object> selectByLimit(String name, String username, Integer pageNum, Integer pageSize) {
        //第一页从0-5，第二页从6-10，第三页11-15
        //skipNum在数据库里是表示跳过多少个记录，第一页要跳过0条，所以要减一
        //第二页要跳过5条，所以（2-1）*5
        Integer skipNum = (pageNum - 1) * pageSize;
        Map<String, Object> map = new HashMap<>();
        List<User> users = userMapper.selectByLimit(name, username, skipNum, pageSize);
        Integer total = userMapper.selectByTotal(name, username);
        map.put("list", users);
        map.put("total", total);
        return map;
    }

    //验证用户账号是否合法
    public User login(User user) {
        //根据用户名查询数据库用户信息
        User user1 = userMapper.selectByUsername(user.getUsername());
        if (user1 == null) {
            //抛出一个自定义的异常
            throw new ServiceException("账号不存在");
        }
        if (!user.getPassword().equals(user1.getPassword())) {
            throw new ServiceException("用户名或密码错误");
        }
        //生成Token
        String token = TokenUtils.createToken(user1.getId().toString(), user1.getPassword());
        user1.setToken(token);
        return user1;
    }

    public User register(User user) {
        User user1 = userMapper.selectByUsername(user.getUsername());
        if (user1 != null) {
            //用户已存在，抛出一个自定义异常
            throw new ServiceException("用户已存在");
        }
        user.setName(user.getUsername() + RandomUtil.randomNumbers(4));    //默认名称
        userMapper.insert(user);
        return user;
    }
}
